<?php

/**
 * Script di deployment del CORE di Zender
 * L'upload tramite protocollo FTP soffre di un
 * grande overhead per file piccoli e numerosi
 * (quali quelli dello Zender)
 * 
 * Questo script ha lo scopo di decomprimere tutti o una selezione di file
 * *.zpkg (Zip file) in una cartella specificata
 *
 * @author Ximarx
 * @version 0.0.1
 */


define('INSTALL_LIBDIR', 'lib/');

// Libreria necessaria per l'estrazione
require_once(INSTALL_LIBDIR . 'pclzip.php');

/**
 * Funzione callback per il filtraggio della cartella module dei file ZPKG
 * Permette l'estrazione del contenuto del pacchetto nella path di esecuzione
 * dello script.
 * NON ESEGUE LA LOGICA DI INSTALLAZIONE O AGGIORNAMENTO
 *
 * @param unknown_type $p_event
 * @param unknown_type $p_header
 * @return integer 
 */
function extractModuleOnly($p_event, &$p_header) {

	$info = pathinfo($p_header['filename']);
	/**
	 * Se il file o la cartella appartengono alla cartella module
	 * allora il formato di $info[dirname] è
	 * .//module/percorso/nomefile.ext
	 * 
	 * @todo assicurarsi che in ambiente windows
	 * '/' non venga sostituito da '\' 
	 */
	if ( substr($info['dirname'], 0, 10) == './/module/' ) {
		$p_header['filename'] = substr($p_header['filename'], 10);
		// 1: permette estrazione
		return 1;
	} else {
		// 0: skippa l'estrazione del file
		return 0;
	}
}

/**
 * Rappresenta un file ZPKG e ne permette l'estrazione delle componenti
 * tralasciando i metadati
 * 
 * @see http://ximarx.netsons.org/blog/10/pacchetti-zpkg/
 * @version 0.0.1
 * @author Ximarx
 * @package Zender_Scripts
 * @subpackage Deployment_Script
 */
class ZPkgLite {
	
	/**
	 * Path del file
	 *
	 * @var String
	 */
	private $filepath = "";
	/**
	 * Riferimento a oggetto PclZip
	 *
	 * @var PclZip
	 */
	private $pclzip;
	
	/**
	 * Costruisce l'oggetto impostando il riferimento al file
	 *
	 * @param String $filepath Posizione del file
	 * @throws Exception se il percorso indicato non esiste
	 */
	public function __construct($filepath) {
		if ( file_exists($filepath) ) {
			$this->filepath = $filepath;
			$this->pclzip = new PclZip($filepath);
		} else {
			throw new Exception("File $filepath not exist!");
		}
	}
	
	/**
	 * Esegue l'estrazione del contenuto del pacchetto
	 *
	 * @return boolean true se l'estrazione è andato a buon fine
	 */
	public function extract() {
		return $this->pclzip->extract(PCLZIP_CB_PRE_EXTRACT, 'extractModuleOnly') === 0 ? false : true;
	}
}

// se action è impostato lo setta, altrimenti lo setta a ''
$action = ( array_key_exists('action', $_POST) ? $_POST['action'] : '' );
// se files è impostato lo setta, altrimenti lo setta come array vuoto
$files = ( array_key_exists('files', $_POST) ? $_POST['files'] : array() );

$requisite = array();

// determina la situazione dei requisiti
$requisite[] = array("status" => is_writable("."), "message" => "Current dir is not writable");
$requisite[] = array("status" => ini_get('safe_mode'), "message" => "Safe Mode in ON");

?>
<html>
	<head>
		<title>Deployment Script for Zender Package (ZPKG)</title>
		<style type="text/css">
		div.result, div.requisite {
			background-color: #eaf5ff;
			border: 1px solid #557fa6;
			padding: 10px;
			width: 98%;
			text-align: center;
			margin-bottom: 30px;
		}
		p.success {
			background-color: #e6ffe8;
			border: 1px solid #59985f;
			padding: 7px;
			width: 98%;
			color: #59985f;
			margin-top: 5px;
			margin-bottom: 5px;
		}
		p.warning, p.error {
			background-color: #fbe6e6;
			border: 1px solid #802424;
			padding: 7px;
			width: 98%;
			color: #802424;
			margin-top: 5px;
			margin-bottom: 5px;
			font-weight: bold;
		}
		table {
			width: 100%;
		}
		td.box {
			width: 50px;
			text-align: center;
			background-color: #f6f2c0;
		}
		td.name {
			background-color: #eaf5ff;
			font-weight: bold;
			padding: 5px;
		}
		td {
			margin: 3px;
		}
		input {
			border: 1px solid black;
		}
		</style>
	</head>
	<body>
<?php

if ( count($requisite) > 0) {

	$req_header = true;
	
	for ( $i = 0; $i < count($requisite); $i++) {
		if ( $requisite[$i]['status'] === false ) {
			if ( $req_header ) {
				$req_header = false;
				echo '<div class="requisite">';
				// apre il div
			}
			echo '<p class="warning">'.$requisite[$i]['message'].'</p>';
		}
	}
	if ( !$req_header ) {
		// chiude il div
		echo '</div>';
	}
	
} 

if ( $action === "Extract" ) {
	echo '<div class="result">';
	for ( $i = 0; $i < count($files); $i++) {
		try {
			$package = new ZPkgLite($files[$i]);
			if ( $package->extract() ) {
				echo '<p class="success">File ' . $files[$i] . ' extracted</p>';
			} else {
				echo '<p class="warning">Error extracting file ' . $files[$i] . '</p>';
			}
		} catch (Exception $e) {
			echo '<p class="error">'.$e->getMessage().'</p>';
		}
	}
	echo '</div>';
} elseif ( $action === "Delete" ) {
	echo '<div class="result">';
	for ( $i = 0; $i < count($files); $i++) {
		if ( file_exists($files[$i]) && @unlink($files[$i]) ) {
			echo '<p class="success">File ' . $files[$i] . ' deleted</p>';
		} else {
			echo '<p class="error">Error deleting file ' . $files[$i] . '</p>';
		}
	}
	echo '</div>';
}


// carica la lista delle estensioni nella directory
$zpkgs = array();
$dir = new DirectoryIterator(".");
while ( $dir->valid() ) {
	$entry = $dir->current();
	if ( $entry->isFile() && substr($entry->getFilename(), -4) == 'zpkg' ) {
		$zpkgs[] = $entry->getFilename();
	}
	$dir->next();
}

?>
		<h2>List of Zender Packages in script path. Select some of those for extraction</h2>
		<form method="POST">
			<table cellspacing="1" cellpadding="1">
				<?php for ( $i = 0; $i < count($zpkgs); $i++): ?>
				<tr>
					<td class="box"><input type="checkbox" name="files[]" value="<?php echo $zpkgs[$i]; ?>" /></td>
					<td class="name"><p><?php echo $zpkgs[$i]; ?></p></td>
				</tr>
				<?php endfor; ?>
			</table>
			<p>
				<input type="submit" name="action" value="Extract" />
				<input type="submit" name="action" value="Delete" />
			</p>
		</form>
	</body>
</html>
